package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var once sync.Once
	var wg sync.WaitGroup

	// 定义需要只执行一次的初始化函数
	initFunc := func(i int) {
		fmt.Printf("执行初始化操作 %d...\n", i)
		// 模拟初始化耗时（如加载配置、连接数据库等）
		time.Sleep(1 * time.Second)
		fmt.Printf("初始化完成! %d...\n", i)
	}

	// 启动10个goroutine，同时调用once.Do(initFunc)
	wg.Add(10)
	for i := 0; i < 10; i++ {
		go func(id int) {
			defer wg.Done()
			fmt.Printf("goroutine %d 准备调用初始化\n", id)

			// 关键：通过once.Do确保initFunc只执行一次
			once.Do(func() {
				initFunc(id)
			}) //第一个执行的routine会执行initFunc，其他routine会阻塞等待，直到initFunc执行完毕

			fmt.Printf("goroutine %d 继续执行后续逻辑\n", id)
		}(i)
	}

	wg.Wait()
	fmt.Println("所有goroutine执行完毕")
}
